R für Linguistik und Sozialwissenschaften (Angewandte Datenverarbeitung und Visualisierung)
  • D. Palleschi
  1. Datenvisualisierung 3
  • Einführung in R und RStudio
  • Datenvisualiserung 1
  • Einführung in Quarto
  • Datentransformation
  • Datenvisualiserung 2
  • Datenimport
  • Deskriptive Statistik
  • Datenvisualisierung 3

heutige Themen

  • Lernziele
  • Ressourcen
  • Einrichten
    • Pakete
    • Daten
  • 1 Wiederholung
  • 2 Darstellung von zusammenfassenden Statistiken
    • 2.1 Boxplot
      • 2.1.1 geom_boxplot()
      • 2.1.2 Gruppierter Boxplot
  • 3 Visualisierung des Mittelwerts
    • 3.1 Fehlerbalkenplots
      • 3.1.1 Berechnung der zusammenfassenden Statistik
      • 3.1.2 Plotting mean
      • 3.1.3 Hinzufügen von Fehlerbalken
  • 4 Barplot von Mittelwerten: Finger weg!
    • 4.1
    • 4.2 Fehlerbalkendiagramm vs. Balkendiagramm für Mittelwerte
    • 4.3 Gleiche Grenzen auf der y-Achse
    • 4.4 Zusammenfassende Statistiken und Verteilung
  • Session Info

Andere Formate

  • RevealJS
  • PDF

Datenvisualisierung 3

  • Gesamten Code zeigen
  • Gesamten Code verbergen

  • Quellcode anzeigen

Darstellung der zusammenfassenden Statistik

Autor:in
Zugehörigkeit

Daniela Palleschi

Humboldt-Universität zu Berlin

Lernziele

Heute werden wir lernen…

  • Boxplots zu erstellen und zu interpretieren
  • Mittelwerte und Standardabweichungen zu visualisieren

Ressourcen

  • Kurswebsite (Datenvisualisierung 3)
  • Abschnitt 2.5 (Visualisierung von Beziehungen) in Wickham et al. (2023)
  • Kapitel 4 (Darstellung von zusammenfassenden Statistiken) in Nordmann et al. (2022)
  • Abschnitte 3.5-3.9 in Winter (2019)

Einrichten

Pakete

pacman::p_load(tidyverse,
               here,
               janitor,
               ggthemes,
               patchwork)

Daten

df_eng <- read_csv(
  here(
    "daten",
    "languageR_english.csv"
  )
) |> 
  clean_names() |> 
  rename(
    rt_lexdec = r_tlexdec,
    rt_naming = r_tnaming
  )

1 Wiederholung

  • Betrachten Sie jede Abbildung in Abbildung 1
    • Wie viele Variablen werden in jeder Abbildung dargestellt?
    • welche Typen von Variablen sind es?
    • Welche zusammenfassende(n) Statistik(en) wird/werden in jedem Diagramm dargestellt?
Abbildung 1: Different plots types

2 Darstellung von zusammenfassenden Statistiken

  • Modus und Bereich werden in Histogrammen und Dichteplots visualisiert
  • die Anzahl der Beobachtungen wird in Balkendiagrammen visualisiert

2.1 Boxplot

  • auch bekannt als Box-and-Whisker-Plots, enthalten
    • eine Box
    • eine Linie in der Mitte der Box
    • Linien, die an beiden Enden der Box herausragen (die ‘Whisker’)
    • manchmal Punkte


  • Betrachten Sie Abbildung 2
    • identifiziere jeden dieser 4 Aspekte des Plots
    • können Sie erraten, was jeder dieser Aspekte darstellen könnte und wie Sie die Darstellung interpretieren sollten?
Abbildung 2: Boxplot of df_eng (body mass by age_subject)

  • Boxplots vermitteln eine Menge Informationen in einer einzigen Visualisierung
    • Die Box selbst stellt den Interquartilsbereich (IQR; der Bereich der Werte, der zwischen den mittleren 50% der Daten liegt) dar.
      • Die Grenzen der Box repräsentieren Q1 (1. Quartil, unter dem 25% der Daten liegen) und Q3 (3. Quartil, über dem 25% der Daten liegen)
    • die Linie in der Mitte des Boxplots stellt den Median dar
      • auch Q2 genannt (2. Quartil; der mittlere Wert, über/unter dem 50% der Daten liegen)
    • Die Whisker repräsentieren 1,5*IQR von Q1 (unterer Whisker) oder Q3 (oberer Whisker)
    • Punkte, die außerhalb der Whisker liegen, stellen Ausreißer dar (d. h. Extremwerte, die außerhalb des IQR liegen).

  • ?@fig-winter-boxplot-hist zeigt die Beziehung zwischen einem Histogramm und einem Boxplot

Image source: Winter (2019) (all rights reserved)

  • ?@fig-wickham-boxplot-hist hat einen ähnlichen Vergleich, einschließlich eines Streudiagramms

Image source: Wickham et al. (2023) (all rights reserved)

2.1.1 geom_boxplot()

  • Die Funktion geom_boxplot() von ggplot2 erzeugt Boxplots
    • sie benötigt eine numerische Variable als x oder y Achse (Abbildung 3)
df_eng |> 
  ggplot(aes(y = rt_lexdec)) +
  geom_boxplot() 
Abbildung 3: A boxplot for all observations of a continuous variable

  • für Boxplots verschiedener Gruppen: eine kategorische Variable entlang der anderen Achse (Abbildung 4)
df_eng |> 
  ggplot(aes(x = age_subject, y = rt_lexdec)) +
  geom_boxplot() +
  theme_bw()
Abbildung 4: A boxplot for two groups

2.1.2 Gruppierter Boxplot

  • Wir können gruppierte Boxplots erstellen, um mehr Variablen zu visualisieren
    • einfach eine neue Variable mit colour oder fill ästhetisch zuordnen
df_eng |> 
  ggplot(aes(x = age_subject, y = rt_lexdec, 
             colour = word_category)) +
  geom_boxplot() +
  labs(
    x = "Age group",
    y = "LDT reaction time (ms)",
    color = "Word type"
  ) +
  scale_colour_colorblind() +
  theme_bw()

A grouped boxplot

3 Visualisierung des Mittelwerts

  • In der Regel wollen wir auch den Mittelwert mit der Standardabweichung darstellen.
    • Wie können wir das tun?

3.1 Fehlerbalkenplots

  • Diese Diagramme bestehen aus 2 Teilen:
    • der Mittelwert, visualisiert mit geom_point()
    • ein Maß für die Streuung, visualisiert mit “geom_errorbar()”.
  • für diesen Kurs werden wir die Standardabweichung verwenden
  • Abbildung 5 ist das, was wir heute erzeugen werden
Abbildung 5: Errorbar plot of df_eng (body mass by age_subject)

3.1.1 Berechnung der zusammenfassenden Statistik

  • müssen wir zunächst den Mittelwert und die Standardabweichung berechnen
    • gruppiert nach den Variablen, die wir visualisieren wollen
  • Wie kann man den Mittelwert und die Standardabweichung von rt_lexdec nach age_subject berechnen?
Click here to see how
sum_eng <- df_eng |> 
  summarise(mean = mean(rt_lexdec),
            sd = sd(rt_lexdec),
            N = n(),
            .by = age_subject) |> 
  arrange(age_subject, age_subject)
  • Diese Zusammenfassung können wir dann in ggplot() mit den entsprechenden ästhetischen Zuordnungen und Geomen einfügen

3.1.2 Plotting mean

  • Zunächst werden die Mittelwerte mit geom_point() dargestellt.
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean) +
  geom_point()

3.1.3 Hinzufügen von Fehlerbalken

  • Fügen wir nun unsere Fehlerbalken hinzu, die 1 Standardabweichung über und unter dem Mittelwert darstellen
  • wir tun dies mit geom_errorbar()
    • nimmt ymin und ymax als Argumente
    • In unserem Fall sind dies mean-/+sd.
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean) +
  geom_point() +
  geom_errorbar(aes(ymin = mean-sd, 
                    ymax = mean+sd))


  • Wenn wir weitere Anpassungen hinzufügen, erhalten wir Abbildung 6
Code
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean, 
      colour = age_subject, shape = age_subject,
      ymin=mean-sd, ymax=mean+sd) +
  geom_point(size = 3) +
  geom_errorbar(width = .5) +
  labs(title = "Mean LDT times (+/-1SD)",
    x = "Age group",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  scale_color_colorblind() +
  theme_bw() +
  theme(
    legend.position = "none"
  )
Abbildung 6: Customised errorbar

4 Barplot von Mittelwerten: Finger weg!

  • Sie werden sehr oft Balkendiagramme von Mittelwerten sehen
    • aber es gibt viele Gründe, warum dies eine schlechte Idee ist!!
  • Der Balkenplot hat ein schlechtes Daten-Tinten-Verhältnis, d.h. die Menge der Datentinte geteilt durch die Gesamttinte, die zur Erstellung der Grafik benötigt wird
    • Was ist, wenn es nur sehr wenige oder gar keine Beobachtungen in der Nähe von Null gibt? Wir verbrauchen eine Menge Tinte, wo es keine Beobachtungen gibt!
    • Außerdem deckt der Balken nur den Bereich ab, in dem die untere Hälfte der Beobachtungen liegt; ebenso viele Beobachtungen liegen über dem Mittelwert!

4.1

  • Wie groß ist die Bandbreite der beobachteten Werte?
range(df_eng$rt_lexdec)
[1]  495.38 1323.20
  • beachten Sie, dass der tatsächliche Bereich der Datenpunkte und das Balkendiagramm viel “Tinte” für datenfreie (d. h. unbeobachtete) Reaktionszeitwerte verwenden
Abbildung 7: Balkendiagramm des Mittelwerts mit +/- 1 Standardabweichung (ich empfehle, von solchen Diagrammen abzusehen!)

4.2 Fehlerbalkendiagramm vs. Balkendiagramm für Mittelwerte

  • Abbildung 8 A und B stellen dieselbe Information dar
Abbildung 8: Fehlerbalken-Diagramm und Balkendiagramme, die Mittelwerte (+/-1SD) darstellen, sowie ein Histogramm der gleichen Daten

4.3 Gleiche Grenzen auf der y-Achse

  • Abbildung 9 zeigt die gleichen Daten, aber mit dem gleichen y-Achsenbereich
Abbildung 9: Fehlerbargraphik und Balkenplots, die Mittelwerte (+/-1SD) darstellen, sowie ein Histogramm derselben Daten mit demselben y-Achsenbereich

4.4 Zusammenfassende Statistiken und Verteilung

  • Fehlerbalken allein sind keine Lösung: auch hier wird eine Menge Information verborgen
    • ein guter Grund, die Rohdatenpunkte immer zu visualisieren, unabhängig davon, welche zusammenfassende Darstellung Sie erstellen

Lernziele 🏁

In diesem Abschnitt haben wir gelernt, wie man…

  • Boxplots erstellen und interpretieren ✅
  • Fehlerbalkendiagramme erstellen und interpretieren ✅

Hausaufgabe

Anhang 8: Datenvisualisierung 3 auf der Website des Kurses.

Session Info

Hergestellt mit R version 4.4.0 (2024-04-24) (Puppy Cup) und RStudioversion 2023.9.0.463 (Desert Sunflower).

print(sessionInfo(),locale = F)
R version 4.4.0 (2024-04-24)
Platform: aarch64-apple-darwin20
Running under: macOS Ventura 13.2.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
 [1] magick_2.8.3    patchwork_1.2.0 ggthemes_5.1.0  janitor_2.2.0  
 [5] here_1.0.1      lubridate_1.9.3 forcats_1.0.0   stringr_1.5.1  
 [9] dplyr_1.1.4     purrr_1.0.2     readr_2.1.5     tidyr_1.3.1    
[13] tibble_3.2.1    ggplot2_3.5.1   tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] utf8_1.2.4        generics_0.1.3    renv_1.0.7        stringi_1.8.3    
 [5] hms_1.1.3         digest_0.6.35     magrittr_2.0.3    evaluate_0.23    
 [9] grid_4.4.0        timechange_0.3.0  fastmap_1.1.1     rprojroot_2.0.4  
[13] jsonlite_1.8.8    fansi_1.0.6       scales_1.3.0      cli_3.6.2        
[17] crayon_1.5.2      rlang_1.1.3       bit64_4.0.5       munsell_0.5.1    
[21] withr_3.0.0       yaml_2.3.8        parallel_4.4.0    tools_4.4.0      
[25] tzdb_0.4.0        colorspace_2.1-0  pacman_0.5.1      png_0.1-8        
[29] vctrs_0.6.5       R6_2.5.1          lifecycle_1.0.4   snakecase_0.11.1 
[33] bit_4.0.5         htmlwidgets_1.6.4 vroom_1.6.5       pkgconfig_2.0.3  
[37] pillar_1.9.0      gtable_0.3.5      glue_1.7.0        Rcpp_1.0.12      
[41] xfun_0.43         tidyselect_1.2.1  rstudioapi_0.16.0 knitr_1.46       
[45] farver_2.1.1      htmltools_0.5.8.1 labeling_0.4.3    rmarkdown_2.26   
[49] compiler_4.4.0   

Literaturverzeichnis

Nordmann, E., McAleer, P., Toivo, W., Paterson, H., & DeBruine, L. M. (2022). Data Visualization Using R for Researchers Who Do Not Use R. Advances in Methods and Practices in Psychological Science, 5(2), 251524592210746. https://doi.org/10.1177/25152459221074654
Wickham, H., Çetinkaya-Rundel, M., & Grolemund, G. (2023). R for Data Science (2. Aufl.).
Winter, B. (2019). Statistics for Linguists: An Introduction Using R. In Statistics for Linguists: An Introduction Using R. Routledge. https://doi.org/10.4324/9781315165547
Quellcode
---
title: "Datenvisualisierung 3"
subtitle: "Darstellung der zusammenfassenden Statistik"
author: "Daniela Palleschi"
institute: Humboldt-Universität zu Berlin
footer: "Datenvisualisierung 3" 
lang: de
format: 
  html:
    output-file: data_viz3_blatt_DE.html
    include-after-body: ../../custom.html
    number-sections: true
    number-depth: 3
    toc: true
    toc-title: "heutige Themen"
    code-overflow: wrap
    code-tools: true
    self-contained: true
    execute:
      fig-width: 6
      fig-asp: .618
      fig-align: centre
  revealjs: 
    output-file: data_viz3_folien_DE.html
    include-after-body: ../../custom.html
    theme: [dark]
    width: 1600
    height: 900
    progress: true
    # smaller: true
    scrollable: true
    slide-number: c/t
    code-link: true
    code-overflow: wrap
    code-tools: true
    # logo: logos/hu_logo.png
    # css: logo.css
    incremental: true
    number-depth: 1
    toc: false
    toc-depth: 1
    toc-title: 'Überblick'
    navigation-mode: linear
    controls-layout: bottom-right
    fig-cap-location: top
    font-size: 0.6em
    slide-level: 4
    self-contained: true
    # chalkboard: true
    title-slide-attributes: 
      data-background-image: logos/logos.tif
      data-background-size: 15%
      data-background-position: 50% 92%
    execute:
      fig-width: 6
      fig-asp: .618
      fig-align: centre
  pdf:
    toc: true
    number-sections: true
    colorlinks: true
    code-overflow: wrap
    execute:
      out-width: "80%"
      fig-asp: .618
      fig-align: centre
bibliography: ../../references.bib
csl: ../../apa.csl
editor_options: 
  chunk_output_type: console
---

```{r}
#| echo: false
knitr::opts_chunk$set(eval = T, ## evaluate chunks
                      echo = T, ## 'print code chunk?'
                      message = F, ## 'print messages (e.g., warnings)?'
                      error = T, ## continueeven when error encountered
                      warning = F) ## don't print warnings
```

# Lernziele {.unnumbered}

Heute werden wir lernen...

- Boxplots zu erstellen und zu interpretieren
- Mittelwerte und Standardabweichungen zu visualisieren

# Ressourcen {.unnumbered}

- [Kurswebsite (Datenvisualisierung 3)](https://daniela-palleschi.github.io/r4ling/mats/10-dataviz_3.html)
- [Abschnitt 2.5 (Visualisierung von Beziehungen)](https://r4ds.hadley.nz/data-visualize#visualizing-relationships) in @wickham_r_2023
- [Kapitel 4 (Darstellung von zusammenfassenden Statistiken)](https://psyteachr.github.io/introdataviz/representing-summary-statistics.html) in @nordmann_data_2022
- Abschnitte 3.5-3.9 in @winter_statistics_2019

# Einrichten {.unnumbered}

## Pakete {.unnumbered}

```{r}
pacman::p_load(tidyverse,
               here,
               janitor,
               ggthemes,
               patchwork)
```

```{r}
#| echo: false
# load magick for the slides
pacman::p_load(magick)
theme_set(theme_bw())
```

## Daten {.unnumbered}

```{r}
df_eng <- read_csv(
  here(
    "daten",
    "languageR_english.csv"
  )
) |> 
  clean_names() |> 
  rename(
    rt_lexdec = r_tlexdec,
    rt_naming = r_tnaming
  )
```

# Wiederholung

:::: columns


::: {.column width="50%"}
- Betrachten Sie jede Abbildung in @fig-distributions
  + Wie viele Variablen werden in jeder Abbildung dargestellt?
  + welche *Typen* von Variablen sind es?
  + Welche zusammenfassende(n) Statistik(en) wird/werden in jedem Diagramm dargestellt?

:::

::: {.column width="50%"}

```{r}
#| echo: false
fig_hist <-
  df_eng |> 
  ggplot(aes(x = rt_lexdec, fill = age_subject)) +
  geom_histogram(binwidth = 50, alpha = 0.5, position = "identity") +
  labs(
    title = "Histogram",
       x = "LDT reaction time (ms)",
       y = "Count",
    fill = "Age group") +
  scale_color_colorblind() +
  scale_fill_colorblind() +
  theme_minimal()

fig_dens <-
  df_eng |> 
  ggplot(aes(x = rt_lexdec, fill = age_subject, colour = age_subject)) +
  geom_density(alpha=.2) +
  labs(
    title = "Density plot",
      x = "LDT reaction time (ms)",
       y = "Density",
    color = "Age group",
    fill = "Age group") +
  scale_color_colorblind() +
  scale_fill_colorblind() +
  theme_minimal()

fig_scat <-
  df_eng |> 
  ggplot(aes(x = rt_lexdec, y = rt_naming)) +
  geom_point(aes(color = age_subject, shape = age_subject), alpha = .3) +
  # geom_smooth(method = "lm") +
  labs(
    title = "Scatterplot",
       x = "LDT reaction time (ms)",
       y = "Naming reaction time (ms)",
    color = "Age group",
    shape = "Age group") +
  scale_color_colorblind() +
  theme_minimal()

fig_bar <-
  df_eng |> 
  ggplot(
       aes(x = age_subject, fill = word_category)) +
  geom_bar() +
    labs(
    title = "Barplot (stacked)",
    x = "Age Group",
    y = "Count",
    fill = "Word Category"
  ) +
  scale_fill_colorblind() +
  theme_minimal()

fig_bar_dodge <-
  df_eng |> 
  ggplot(
        aes(x = age_subject, fill = word_category)) +
  geom_bar(position="dodge") +
    labs(
    title = "Barplot (dodged)",
    x = "Age Group",
    y = "Count",
    fill = "Word Category"
  ) +
  scale_fill_colorblind() +
  theme_minimal()
```

```{r}
#| echo: false
#| label: fig-distributions
#| fig-cap: "Different plots types"
#| fig-width: 8
#| fig-asp: .8

(fig_hist + fig_dens) /
  (fig_scat + fig_bar_dodge) +
  plot_annotation(tag_levels = "A") +
  theme(plot.title = element_blank()) 
```
:::
::::

# Darstellung von zusammenfassenden Statistiken

- Modus und Bereich werden in Histogrammen und Dichteplots visualisiert
- die Anzahl der Beobachtungen wird in Balkendiagrammen visualisiert

## Boxplot

:::: columns

::: {.column width="60%"}
- auch bekannt als Box-and-Whisker-Plots, enthalten
  + eine Box
  + eine Linie in der Mitte der Box
  + Linien, die an beiden Enden der Box herausragen (die 'Whisker')
  + manchmal Punkte
  
:::

::: {.column width="40%"}
```{r}
#| echo: false
boxplot(iris$Sepal.Width)
```

:::

::::

---

:::: columns

::: {.column width="60%"}
- Betrachten Sie @fig-boxplot
  + identifiziere jeden dieser 4 Aspekte des Plots
  + können Sie erraten, was jeder dieser Aspekte darstellen könnte und wie Sie die Darstellung interpretieren sollten?

:::

::: {.column width="40%"}
```{r}
#| ouput-location: column-fragment
#| echo: false
#| code-line-numbers: "|4"
#| label: fig-boxplot
#| fig-cap: "Boxplot of `df_eng` (body mass by age_subject)"

df_eng |> 
  ggplot(aes(x = age_subject, y = rt_lexdec, colour = age_subject)) +
  geom_boxplot() +
  labs(title = "Boxplot",
    x = "Age group",
    y = "LDT Reaction time (ms)",
    color = "Age group"
  ) +
  scale_color_colorblind() +
  theme_minimal() +
  theme(
    legend.position = "none"
  )
```
:::
::::

---

- Boxplots vermitteln eine Menge Informationen in einer einzigen Visualisierung
  + Die Box selbst stellt den *Interquartilsbereich* (IQR; der Bereich der Werte, der zwischen den mittleren 50% der Daten liegt) dar.
    + Die Grenzen der Box repräsentieren Q1 (1. Quartil, unter dem 25% der Daten liegen) und Q3 (3. Quartil, über dem 25% der Daten liegen)
  + die Linie in der Mitte des Boxplots stellt den *Median* dar
    + auch Q2 genannt (2. Quartil; der mittlere Wert, über/unter dem 50% der Daten liegen)
  + Die Whisker repräsentieren `1,5*IQR` von Q1 (unterer Whisker) oder Q3 (oberer Whisker)
  + Punkte, die außerhalb der Whisker liegen, stellen Ausreißer dar (d. h. Extremwerte, die außerhalb des IQR liegen).

---

- @fig-winter-boxplot-hist [@winter_statistics_2019, S. 59] zeigt die Beziehung zwischen einem Histogramm und einem Boxplot

::: {.content-visible when-format="revealjs"}
```{r echo = F, fig.align = "center"}
#| fig-cap: "Image source: @winter_statistics_2019 (all rights reserved)"
#| fig-cap-location: bottom
#| label: fig-winter-boxplot-hist

# invert colours for dark mode in slides
library(magick)
magick::image_negate(magick::image_read(here::here("media/Winter_2019_boxplot.png")))
```
:::

::: {.content-hidden when-format="revealjs"}
```{r echo = F, fig.align = "center"}
#| fig-cap: "Image source: @winter_statistics_2019 (all rights reserved)"
#| fig-cap-location: bottom
magick::image_read(here::here("media/Winter_2019_boxplot.png"))
```
:::

---

- @fig-wickham-boxplot-hist [@wickham_r_2023] hat einen ähnlichen Vergleich, einschließlich eines Streudiagramms

::: {.content-visible when-format="revealjs"}
```{r echo = F, fig.align = "center"}
#| fig-cap: "Image source: @wickham_r_2023 (all rights reserved)"
#| fig-cap-location: bottom
#| label: fig-wickham-boxplot-hist

# invert colours for dark mode in slides
y <- magick::image_read(here::here("media/Wickham_boxplot.png"))

magick::image_negate(y)
```
:::

::: {.content-hidden when-format="revealjs"}
```{r echo = F, fig.align = "center"}
#| fig-cap: "Image source: @wickham_r_2023 (all rights reserved)"
#| fig-cap-location: bottom
magick::image_read(here::here("media/Wickham_boxplot.png"))
```
:::

### `geom_boxplot()`

- Die Funktion `geom_boxplot()` von `ggplot2` erzeugt Boxplots
  + sie benötigt eine numerische Variable als `x` oder `y` Achse (@fig-geom-boxplot-y)

```{r}
#| eval: false
#| 
df_eng |> 
  ggplot(aes(y = rt_lexdec)) +
  geom_boxplot() 
```


```{r}
#| label: fig-geom-boxplot-y
#| fig-cap: "A boxplot for all observations of a continuous variable"
#| fig-asp: .618
#| fig-width: 5
#| echo: false
df_eng |> 
  ggplot(aes(y = rt_lexdec)) +
  geom_boxplot() +
  theme_bw() +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank())
```

---

- für Boxplots verschiedener Gruppen: eine kategorische Variable entlang der anderen Achse (@fig-geom-boxplot)

```{r}
#| label: fig-geom-boxplot
#| fig-cap: "A boxplot for two groups"
#| fig-width: 5
#| fig-asp: .618
df_eng |> 
  ggplot(aes(x = age_subject, y = rt_lexdec)) +
  geom_boxplot() +
  theme_bw()
```

### Gruppierter Boxplot

- Wir können gruppierte Boxplots erstellen, um mehr Variablen zu visualisieren
  + einfach eine neue Variable mit `colour` oder `fill` ästhetisch zuordnen

```{r}
#| output-location: column-fragment
#| fig-width: 7
#| label: df_boxplot_group
#| fig-cap: A grouped boxplot
df_eng |> 
  ggplot(aes(x = age_subject, y = rt_lexdec, 
             colour = word_category)) +
  geom_boxplot() +
  labs(
    x = "Age group",
    y = "LDT reaction time (ms)",
    color = "Word type"
  ) +
  scale_colour_colorblind() +
  theme_bw()
```

# Visualisierung des Mittelwerts

- In der Regel wollen wir auch den Mittelwert mit der Standardabweichung darstellen.
  + Wie können wir das tun?

## Fehlerbalkenplots

:::: columns

::: {.column width="50%"}
- Diese Diagramme bestehen aus 2 Teilen: 
  + der Mittelwert, visualisiert mit `geom_point()`
  + ein Maß für die Streuung, visualisiert mit "geom_errorbar()".
- für diesen Kurs werden wir die Standardabweichung verwenden
- @fig-errorbar ist das, was wir heute erzeugen werden
:::

::: {.column width="50%"}
```{r}
#| ouput-location: column-fragment
#| echo: false
#| label: fig-errorbar
#| fig-width: 5
#| fig-cap: "Errorbar plot of `df_eng` (body mass by age_subject)"

df_eng |> 
  summarise(mean = mean(rt_lexdec),
            sd = sd(rt_lexdec),
            N = n(),
            .by = c(age_subject)) |> 
  ggplot(aes(x = age_subject, y = mean, colour = age_subject, shape = age_subject)) +
  # geom_point(data = df_eng, alpha = .4, position = position_jitterdodge(.5), aes(x = age_subject, y = rt_lexdec)) +
  geom_point(size = 3) +
  geom_errorbar(width = .5, aes(ymin=mean-sd, ymax=mean+sd)) +
  labs(title = "Mean LDT time (+/-1 SD)",
    x = "Age group",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  scale_color_colorblind() +
  theme_bw() +
  theme(
    legend.position = "none"
  )
```
:::
::::

### Berechnung der zusammenfassenden Statistik

- müssen wir zunächst den Mittelwert und die Standardabweichung berechnen
  + gruppiert nach den Variablen, die wir visualisieren wollen
+ Wie kann man den Mittelwert und die Standardabweichung von `rt_lexdec` nach `age_subject` berechnen?

```{r}
#| code-fold: true
#| code-summary: "Click here to see how"
sum_eng <- df_eng |> 
  summarise(mean = mean(rt_lexdec),
            sd = sd(rt_lexdec),
            N = n(),
            .by = age_subject) |> 
  arrange(age_subject, age_subject)
```

- Diese Zusammenfassung können wir dann in `ggplot()` mit den entsprechenden ästhetischen Zuordnungen und Geomen einfügen

### Plotting mean

:::: columns

::: {.column width="50%"}
- Zunächst werden die Mittelwerte mit `geom_point()` dargestellt.
:::

::: {.column width="50%"}
```{r}
#| output-location: fragment
#| code-line-numbers: "3,4"
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean) +
  geom_point()
```
:::
::::

### Hinzufügen von Fehlerbalken

:::: Spalten

::: {.column width="50%"}
- Fügen wir nun unsere Fehlerbalken hinzu, die 1 Standardabweichung über und unter dem Mittelwert darstellen
- wir tun dies mit `geom_errorbar()`
  + nimmt `ymin` und `ymax` als Argumente
  + In unserem Fall sind dies `mean-/+sd`.
:::

::: {.column width="50%"}
```{r}
#| output-location: fragment
#| code-line-numbers: "5,6"
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean) +
  geom_point() +
  geom_errorbar(aes(ymin = mean-sd, 
                    ymax = mean+sd))
```
:::
::::

---

- Wenn wir weitere Anpassungen hinzufügen, erhalten wir @fig-errorbar-custom

```{r}
#| code-fold: true
#| label: fig-errorbar-custom
#| fig-cap: Customised errorbar
#| output-location: column
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean, 
      colour = age_subject, shape = age_subject,
      ymin=mean-sd, ymax=mean+sd) +
  geom_point(size = 3) +
  geom_errorbar(width = .5) +
  labs(title = "Mean LDT times (+/-1SD)",
    x = "Age group",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  scale_color_colorblind() +
  theme_bw() +
  theme(
    legend.position = "none"
  )
```

# Barplot von Mittelwerten: Finger weg! {.smaller}

- Sie werden sehr oft Balkendiagramme von Mittelwerten sehen
  + aber es gibt viele Gründe, warum dies eine schlechte Idee ist!!

- Der Balkenplot hat ein schlechtes Daten-Tinten-Verhältnis, d.h. die Menge der Datentinte geteilt durch die Gesamttinte, die zur Erstellung der Grafik benötigt wird
  + Was ist, wenn es nur sehr wenige oder gar keine Beobachtungen in der Nähe von Null gibt? Wir verbrauchen eine Menge Tinte, wo es keine Beobachtungen gibt!    
  + Außerdem deckt der Balken nur den Bereich ab, in dem die untere *Hälfte* der Beobachtungen liegt; ebenso viele Beobachtungen liegen über dem Mittelwert!

  
##

- Wie groß ist die Bandbreite der beobachteten Werte?

```{r}
#| output-location: fragment
range(df_eng$rt_lexdec)
```

- beachten Sie, dass der tatsächliche Bereich der Datenpunkte und das Balkendiagramm viel "Tinte" für datenfreie (d. h. unbeobachtete) Reaktionszeitwerte verwenden

```{r}
#| label: fig-bar
#| fig-cap: "Balkendiagramm des Mittelwerts mit +/- 1 Standardabweichung (ich empfehle, von solchen Diagrammen abzusehen!)"
#| echo: false
#| output-location: fragment
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean, 
      fill = age_subject, shape = age_subject,
      ymin=mean-sd, ymax=mean+sd) +
  geom_col() +
  geom_errorbar(width = .5, colour = "darkgrey") +
  labs(title = "Mean LDT times (+/-1SD)",
    x = "Age group",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  scale_fill_colorblind() +
  theme_bw() +
  theme(
    legend.position = "none"
  )
```


  
## Fehlerbalkendiagramm vs. Balkendiagramm für Mittelwerte

- @fig-barplot A und B stellen dieselbe Information dar

```{r}
#| label: fig-barplot
#| fig-cap: "Fehlerbalken-Diagramm und Balkendiagramme, die Mittelwerte (+/-1SD) darstellen, sowie ein Histogramm der gleichen Daten"
#| echo: false
#| out-width: "100%"
#| fig-height: 4
#| fig-dpi: 1600
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean, 
      colour = age_subject, shape = age_subject,
      ymin=mean-sd, ymax=mean+sd) +
  geom_point(size = 3) +
  geom_errorbar(width = .5) +
  labs(title = "Mean LDT times (+/-1SD)",
    x = "Age group",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  scale_color_colorblind() +
  theme_bw() +
  theme(
    legend.position = "none"
  ) +
  
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean, 
      fill = age_subject, shape = age_subject,
      ymin=mean-sd, ymax=mean+sd) +
  geom_col() +
  geom_errorbar(width = .5, colour = "darkgrey") +
  labs(title = "Mean LDT times (+/-1SD)",
    x = "Age group",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  scale_fill_colorblind() +
  theme_bw() +
  theme(
    legend.position = "none"
  ) +
df_eng |> 
  ggplot() +
  aes(y = rt_lexdec, fill = age_subject) +
  geom_histogram(alpha = 0.5, position = "identity") +
  scale_fill_colorblind() +  
  labs(title = "Verteilung der Reaktionszeiten",
    x = "Häufigkeit",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  theme_bw() +
  theme(
    legend.position = "none"
  ) +
      plot_annotation(tag_levels = "A") 
  
```

## Gleiche Grenzen auf der y-Achse

- @fig-barplot-range zeigt die gleichen Daten, aber mit dem gleichen y-Achsenbereich



```{r}
#| label: fig-barplot-range
#| fig-cap: "Fehlerbargraphik und Balkenplots, die Mittelwerte (+/-1SD) darstellen, sowie ein Histogramm derselben Daten mit demselben y-Achsenbereich"
#| echo: false
#| fig-width: 8
#| fig-asp: .3

sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean, 
      colour = age_subject, shape = age_subject,
      ymin=mean-sd, ymax=mean+sd) +
  geom_point(size = 3) +
  geom_errorbar(width = .5) +
  labs(title = "Mean LDT times (+/-1SD)",
    x = "Age group",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  scale_color_colorblind() +
  theme_bw() +
  theme(
    legend.position = "none"
  ) +
  ylim(0,1400) +
sum_eng |> 
  ggplot() +
  aes(x = age_subject, y = mean, 
      fill = age_subject, shape = age_subject,
      ymin=mean-sd, ymax=mean+sd) +
  geom_col() +
  geom_errorbar(width = .5, colour = "darkgrey") +
  labs(title = "Mean LDT times (+/-1SD)",
    x = "Age group",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  scale_fill_colorblind() +
  theme_bw() +
  theme(
    legend.position = "none"
  ) +
  ylim(0,1400) +
df_eng |> 
  ggplot() +
  aes(y = rt_lexdec, fill = age_subject) +
  geom_histogram(alpha = 0.5, position = "identity") +
  scale_fill_colorblind() +  
  labs(title = "Verteilung der Reaktionszeiten",
    x = "Häufigkeit",
    y = "Reaction time (ms)",
    color = "Age group"
  ) +
  theme_bw() +
  theme(
    legend.position = "none"
  ) +
  ylim(0,1400) +
      plot_annotation(tag_levels = "A") 
  
```

## Zusammenfassende Statistiken und Verteilung


- Fehlerbalken allein sind keine Lösung: auch hier wird eine Menge Information verborgen
  + ein guter Grund, die Rohdatenpunkte *immer* zu visualisieren, unabhängig davon, welche zusammenfassende Darstellung Sie erstellen

# Lernziele 🏁 {.unnumbered .unlisted}

In diesem Abschnitt haben wir gelernt, wie man...

- Boxplots erstellen und interpretieren ✅
- Fehlerbalkendiagramme erstellen und interpretieren ✅

## Hausaufgabe {.unnumbered}

[Anhang 8: Datenvisualisierung 3](https://daniela-palleschi.github.io/r4ling/appendices/00-aufgaben.html#sec-app_data_viz3) auf der Website des Kurses.


# Session Info {.unnumbered}

```{r}
#| eval: false
#| echo: false
RStudio.Version()$version
```


Hergestellt mit `r R.version.string` (`r R.version$nickname`) und RStudioversion 2023.9.0.463 (Desert Sunflower).

```{r}
print(sessionInfo(),locale = F)
```

# Literaturverzeichnis {.unlisted .unnumbered visibility="uncounted"}

::: {#refs custom-style="Bibliography"}
:::